<?php
abstract class Core{
    /**
    * 系统主函数用来按照系统指定的app，m,a去找到指定的组中的指定的控制器中的指定Action来运行
    * @param type $app 应用名称
    * @param type $m Controller名称
    * @param type $a Acton名称
    * @param type $data 其他参数
    */
    static private $g;
    static function setParams($g){
        self::$g = $g;
    }
    static function run($app = 'Home', $m = 'Index', $a = 'index', $data){
        $controller = $m.'Controller';
        
        if($app == ''){
            $path = __BASE__.'/'.$controller.'.class.php';
        }else{
            $path = './Apps/'.$app.'/Controller/'.$controller.'.class.php';
        }


        if(!file_exists($path)){
            $error = 'module_is_not_exists:'.$controller;
            $bb = realpath('./Apps');
             
        }else{

            include_once($path);
            if(!class_exists($controller)){
                $error = 'module_is_not_exists:'.$controller;
                
            }else{
                $x = new $controller($data);
               
                if(empty($x->tplVars)){
                    $x->$a();
                }
            }
        }

        if(!empty($error)){
            $x = new Controller($data);
            $x->error($error);
        }
    }
    
    /**
    * 检查过滤字符串的函数，进行防注入处理
    * @param type $data 要过滤的参数可以使数组或字符串
    * @return type 数组或字符串
    */
    static function checkStr($data){
        if(is_array($data)){
            foreach($data as $k => $v){
                if($k == 'submit'){
                    unset($data[$k]);
                }else{
                    $data[$k] = self::check($v);
                }
            }
            return $data;
        }
        return self::check($data);
    }
    /**
    * 处理字符串，防注入处理
    * @param type $text 要过滤的字符串
    * @return type 过滤之后的字符串
    */
    static function check($text){
        //处理Sql注入问题
        $text = str_replace(';','',$text);
        $text = str_replace(',','',$text);
        $text = str_replace('#','',$text);

        //处理HTML脚本注入问题
    //    $text = str_replace('<', '&lt;', $text);
    //    $text = str_replace('>', '&gt;', $text);
        return $text;
    }

    /**
    * 取得POST提交的数据，如果不传入参数则返回$_POST数组
    * @param type $name 提交表单的名称
    * @return type 提交表单的值
    */
    static function P($name = null){
        self::checkReferer();
        if(!empty($name)){
            return self::checkStr($_POST[$name]);
        }else{
            return self::checkStr($_POST);
        }
    }

    /**
    * 不允许远程提交POST数据 GET提交的防远程提交请用户自己斟酌，请注意您不能屏蔽所有的外部GET提交，否则搜索引擎将无法找到您的页面。
    */
    static function checkReferer(){
//        if(!empty($_POST)){
////            $thisDomain = $_SERVER['SERVER_NAME'];
////            $referer= str_replace('http://','',$_SERVER['HTTP_REFERER']);
////            $arr = explode('/', $referer);
////            $refererDomail = $arr[0];
////            $appKey = self::$g['appKey'];
////            $cAppKey = self::getAdminConfig('Appkey');
////            echo $appKey,'<br>', $cAppKey;
////            if($thisDomain != $refererDomail && empty($_FILES) && $appKey != $cAppKey){
////                die(L('you_can_not_remotely_want_the_site_to_submit_data'));
////            }
//        }
    }

    /**
    * 取得GET提交的数据，如果不传入参数则返回$_GET数组
    * @param type $name 提交参数的名称
    * @return type 提交参数的值
    */
    static function G($name = null){
        if(!empty($name)){
            return self::checkStr($_GET[$name]);
        }else{
            return self::checkStr($_GET);
        }
    }

    /**
    * 取得REQUEST提交的数据，如果不传入参数则返回$_REQUEST数组
    * @param type $name 提交参数的名称
    * @return type 提交参数的值
    */
    static function R($name = null){
        if(!empty($name)){
            return self::checkStr($_REQUEST[$name]);
        }else{
            return self::checkStr($_REQUEST);
        }
    }
    
    static function getAdminConfig($_key){
        $file = './Data/config/'.$_key.'.jpg';
        $text = file_get_contents($file);
        return $text;
    }
    
    static function getConfig($name){
        $configs = include('./Apps/'.APP_NAME.'/Conf/config.php');
        return $configs[$name];
    }
}

?>
